package main

import "fmt"

func main() {
	var num1 int = 10
	var num2 int = 20
	fmt.Printf("交换前两个数: num1: %v, num2: %v \n", num1, num2) // 10, 20
	exchangeNum(num1, num2)
	fmt.Printf("交换后两个数: num1: %v, num2: %v \n", num1, num2) // 10, 20

	// 函数也是一种数据类型, 可以赋值给一个变量
	a := test
	fmt.Printf("a的类型: %T, test的类型: %T   \n", a, test) // a的类型: func(int), test的类型: func(int)

	// 通过该变量可以给对应的函数调用赋值
	a(10)

	// 调用test02函数
	test02(10, 3.14, test) // 最后一个参数传入test函数
	test02(10, 3.14, a)    // 传入a也可以, 是等价的

	type myInt int
	var num myInt = 30
	fmt.Println("num: ", num) // 30

	var abc int = 10
	// 虽然num是myInt类型的,是int的别名,但是myInt和int不是一种数据类型,所以这样会报错
	//abc = num

	// 如果想要赋值给abc这个int的变量, 可以把myInt类型转为int类型
	abc = int(num)
	fmt.Println("abc: ", abc) // 30
}

func test(num int) {
	fmt.Println(num)
}

type myFunc func(int)

func test02(num1 int, num2 float32, testFunc myFunc) {
	fmt.Println("------test02")
	testFunc(99) // 这里又调用了test函数
}

// 给两个参数互相交换值
func exchangeNum(num1 int, num2 int) {
	var t int
	t = num1
	num1 = num2
	num2 = t
}
